/**
 ******************************************************************************
 * @file           : bsp_wwdg_config.h
 * @brief          : WWDG Configuration File (STM32H7xx)
 ******************************************************************************
 * @attention
 *
 * 窗口看门狗配置文件
 * 包含日志配置、超时时间、窗口值等参数
 * 用户根据实际需求修改此文件
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_WWDG_CONFIG_H
#define __BSP_WWDG_CONFIG_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32h7xx.h"

/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/

/* ============================================================================ */
/*                       日志系统配置（改这里的数字）                             */
/* ============================================================================ */
/* 日志后端选择：1=EasyLogger, 2=printf, 0=关闭 */
#define WWDG_USE_LOG     1

/* 根据配置自动定义日志宏 */
#if (WWDG_USE_LOG == 1)
    /* 使用EasyLogger */
    #ifndef LOG_TAG
        #define LOG_TAG    "WWDG"
    #endif
    #include "elog.h"
    
#elif (WWDG_USE_LOG == 2)
    /* 使用printf */
    #include <stdio.h>
    #define log_i(fmt, ...)     printf(fmt "\r\n", ##__VA_ARGS__)
    #define log_w(fmt, ...)     printf("[WARN] " fmt "\r\n", ##__VA_ARGS__)
    #define log_e(fmt, ...)     printf("[ERROR] " fmt "\r\n", ##__VA_ARGS__)
    #define log_d(fmt, ...)     printf("[DEBUG] " fmt "\r\n", ##__VA_ARGS__)
    
#else
    /* 关闭日志 */
    #define log_i(fmt, ...)
    #define log_w(fmt, ...)
    #define log_e(fmt, ...)
    #define log_d(fmt, ...)
#endif

/* ============================================================================ */
/*                          看门狗配置（用户可修改）                              */
/* ============================================================================ */

/**
 * WWDG时序参数说明：
 * - PCLK1 = 100MHz（STM32H7xx默认APB1时钟）
 * - WWDG时钟 = PCLK1 / 4096 / Prescaler
 * - 超时时间(ms) = (Counter - Window) * (1 / WWDG时钟) * 1000
 * 
 * 预分频器(Prescaler)可选值：
 * - WWDG_PRESCALER_1: 分频1  →  WWDG时钟 = 24.414kHz  →  计数器周期 = 0.041ms
 * - WWDG_PRESCALER_2: 分频2  →  WWDG时钟 = 12.207kHz  →  计数器周期 = 0.082ms
 * - WWDG_PRESCALER_4: 分频4  →  WWDG时钟 = 6.104kHz   →  计数器周期 = 0.164ms
 * - WWDG_PRESCALER_8: 分频8  →  WWDG时钟 = 3.052kHz   →  计数器周期 = 0.328ms
 */

/* 预分频器配置（四选一） */
#define WWDG_PRESCALER_DIV_1            /* 分频1（最快） */
// #define WWDG_PRESCALER_DIV_2         /* 分频2 */
// #define WWDG_PRESCALER_DIV_4         /* 分频4 */
// #define WWDG_PRESCALER_DIV_8         /* 分频8（最慢） */

/* 计数器初值配置 */
#define WWDG_COUNTER_VALUE      127     /*!< 计数器初值：64~127，必须>窗口值 */
                                        /*!< 127=最大值，可获得最长超时时间 */

/* 窗口值配置 */
#define WWDG_WINDOW_VALUE       80      /*!< 窗口值：64~126，必须<计数器初值 */
                                        /*!< 80=默认值，喂狗窗口适中 */

/**
 * 配置示例说明：
 * 
 * 示例1：快速响应（预分频1，Counter=127，Window=80）
 * - 喂狗窗口 = (127-80) * 0.041ms = 1.93ms
 * - 超时时间 = (127-64) * 0.041ms = 2.59ms
 * - 适用场景：实时性要求极高的系统
 * 
 * 示例2：平衡配置（预分频4，Counter=127，Window=80）
 * - 喂狗窗口 = (127-80) * 0.164ms = 7.7ms
 * - 超时时间 = (127-64) * 0.164ms = 10.3ms
 * - 适用场景：一般嵌入式应用（推荐）
 * 
 * 示例3：长超时（预分频8，Counter=127，Window=80）
 * - 喂狗窗口 = (127-80) * 0.328ms = 15.4ms
 * - 超时时间 = (127-64) * 0.328ms = 20.6ms
 * - 适用场景：CPU负载较高，任务调度周期长
 */

/* ============================================================================ */
/*                       配置自动转换（用户无需修改）                             */
/* ============================================================================ */

/* 预分频器自动转换 */
#if defined(WWDG_PRESCALER_DIV_1)
    #define WWDG_PRESCALER          WWDG_PRESCALER_1
#elif defined(WWDG_PRESCALER_DIV_2)
    #define WWDG_PRESCALER          WWDG_PRESCALER_2
#elif defined(WWDG_PRESCALER_DIV_4)
    #define WWDG_PRESCALER          WWDG_PRESCALER_4
#elif defined(WWDG_PRESCALER_DIV_8)
    #define WWDG_PRESCALER          WWDG_PRESCALER_8
#else
    #error "Please select WWDG prescaler (WWDG_PRESCALER_DIV_1/2/4/8)"
#endif

/* 参数检查 */
#if (WWDG_COUNTER_VALUE < 64) || (WWDG_COUNTER_VALUE > 127)
    #error "WWDG_COUNTER_VALUE must be between 64 and 127"
#endif

#if (WWDG_WINDOW_VALUE < 64) || (WWDG_WINDOW_VALUE > 126)
    #error "WWDG_WINDOW_VALUE must be between 64 and 126"
#endif

#if (WWDG_WINDOW_VALUE >= WWDG_COUNTER_VALUE)
    #error "WWDG_WINDOW_VALUE must be less than WWDG_COUNTER_VALUE"
#endif

/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

#ifdef __cplusplus
}
#endif

#endif /* __BSP_WWDG_CONFIG_H */
